package cn.tedu.set;

import java.util.HashSet;
import java.util.Objects;

/**
 * Date：2021年11月
 * Author：程Sir
 * Name： JavaSE-API
 * Content:
 *
 *      jdk1.8之后，hashSet中加入了红黑树，优化了其底层存储的性能，对于保证HashSet集合元素的唯一性
 *      是通过对象的hashcode和equals方法来确定的！
 *
 */
public class HashSetDemo1 {
    public static void main(String[] args) {
        // 创建hashcode对象
        HashSet<Person> hashSet = new HashSet();
        // 声明一个Person对象
        Person p  = null;
        //向hashSet集合中添加元素
        p = new Person("詹姆斯",38);
        System.out.println(p.hashCode());
        hashSet.add(p);

        Person p1 = new Person("库里",32);
        System.out.println(p1.hashCode());
        hashSet.add(p1);

        p = new Person("哈登",32);
        System.out.println(p.hashCode());
        hashSet.add(p);
        // 重复的添加一个元素
        Person p2 = new Person("库里",32);
        hashSet.add(p2);
        System.out.println(p2.hashCode());
        System.out.println("===================");
        System.out.println(hashSet);
        System.out.println(hashSet.size());// 4?

        System.out.println("================|");
        System.out.println(p1.equals(p2)); // true
    }

}
// 自定义对象如果存储在HashsSet集合中，一定要重写hashcode方法和equals方法，保证存储元素的唯一！
class Person{
    String name;
    int age;
    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age =  age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}